// new的实现原理
function newPerson() {
    // 先return一个对象
    var obj = {};
    var constructor = Array.prototype.shift.call(arguments); //把数组的shift方法借给constructor使用
    // 实例对象的隐式原型===构造函数的显示原型
    obj._proto_ = constructor.prototype;
    var result = constructor.apply(obj, arguments);
    return typeof result === 'object' && result != 'null' ? result : obj;
}

let p = newPerson(Person, 'hunny')
console.log(p); //{ _proto_: {}, name: 'hunny', age: undefined }





//Fun为构造函数, args表示传参
function myNew(Fun, ...args) {
    // 1.在内存中创建一个新对象
    let obj = {};

    // 2.把新对象的原型指针指向构造函数的原型属性
    obj.__proto__ = Fun.prototype;

    // 3.改变this指向，并且执行构造函数内部的代码（传参）
    let res = Fun.apply(obj, args);

    // 4.判断函数执行结果的类型
    if (res instanceof Object) {
        return res;
    } else {
        return obj;
    }
}

let obj = myNew(One, "XiaoMing", "18");
console.log("newObj:", obj);



function myNew(constructor, ...args) {
    // 1、创建一个新对象，继承constructor原型
    const obj = Object.create(constructor.prototype)
    // 2、将obj作为this，执行constructor，传入参数
    const res = constructor.apply(this, args)
    // 3、返回obj
    return res instanceof Object ? res : obj
}